home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
UTILITY
/
XSPAWN.ARJ
/
MM.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-05-04
|
6KB
|
173 lines
;
; (C) Copyright 1990 Whitney Software, Inc.
; All Rights Reserved
;
; Source for MM.COM. Displays the largest executable program size. If
; expanded memory is available, displays the total amount and the free amount.
;
_TEXT SEGMENT word public 'CODE'
ORG 100h
ASSUME cs:_TEXT
ASSUME ds:_TEXT
ASSUME es:_TEXT
ASSUME ss:_TEXT
; calculate largest executable program size
begin: mov ax,cs:[2] ; end of allocation block
mov bx,cs
sub ax,bx ; subtract PSP segment
mov bx,16 ; convert to bytes
call printi ; print integer
mov cx,msg1len ; length
mov dx,offset msg1 ; message 1
call printm ; print message
; determine whether expanded memory is available
call chkems ; check expanded memory
or ah,ah
jnz exit ; jump if no expanded memory
mov ah,42h ; get number of pages
int 67h
or ah,ah
jnz exit ; jump if unsuccessful
push bx ; save unallocated pages
; print total bytes EMS memory
mov ax,dx ; total pages
mov bx,16384 ; convert to bytes
call printi ; print integer
mov cx,msg2len ; length
mov dx,offset msg2 ; message 2
call printm ; print message
; print free bytes EMS memory
pop ax ; unallocated pages
mov bx,16384 ; convert to bytes
call printi ; print integer
mov cx,msg3len ; length
mov dx,offset msg3 ; message 3
call printm ; print message
exit: mov ax,4C00h ; terminate with 0 return code
int 21h
printm PROC near
; Call with: CX = message length
; DX = message
mov ah,40h ; write file or device
mov bx,1 ; standard output device handle
int 21h
ret
printm ENDP
printi PROC near
; Call with: AX = multiplicand
; BX = multiplier
mul bx
; print integer (DX:AX)
mov cx,10 ; radix equals 10
mov si,offset buffer + 11 ; end of buffer
push si
printi1: push ax ; divide integer by 10
mov ax,dx
xor dx,dx
div cx
mov bx,ax
pop ax
div cx
xchg bx,dx ; DX:AX = quotient
; BL = remainder
add bl,'0' ; convert remainder to ASCII
dec si ; back up through buffer
mov [si],bl ; store character in buffer
mov bx,ax ; is integer 0 yet?
or bx,dx
jnz printi1
pop cx ; end of buffer
sub cx,si ; calculate string length
mov dx,si ; beginning of string
call printm ; print string
ret
printi ENDP
chkems PROC near
; determine whether expanded memory is available
mov dx,offset device ; EMM device driver name
mov ax,3D00h ; open file read only
int 21h
jc check2 ; expanded memory unavailable
; determine whether we opened the EMM device driver or a file
mov bx,ax ; handle
mov ax,4400h ; IOCTL - get device info
int 21h
jc check1 ; expanded memory unavailable
test dx,80h ; test bit 7
jz check1 ; expanded memory unavailable
mov ax,4407h ; IOCTL - get output status
int 21h
jc check1 ; expanded memory unavailable
or al,al
jz check1 ; expanded memory unavailable
; close EMM device driver to reclaim handle
mov ah,3Eh ; close file
int 21h
; determine whether the EMM is functional
mov ah,40h ; get manager status
int 67h
or ah,ah
jnz check2 ; expanded memory unavailable
ret
; close EMM device driver or file to reclaim handle
check1: mov ah,3Eh ; close file
int 21h
check2: mov ah,1 ; expanded memory unavailable
ret
chkems ENDP
buffer db 11 dup (?)
device db 'EMMXXXX0',0 ; EMM device driver name
msg1 db ' largest executable program size',0Dh,0Ah,0Dh,0Ah
msg1len EQU $-msg1
msg2 db ' bytes total EMS memory',0Dh,0Ah
msg2len EQU $-msg2
msg3 db ' bytes free EMS memory',0Dh,0Ah
msg3len EQU $-msg3
_TEXT ENDS
END begin